home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1999 March
/
EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso
/
earcd
/
devel
/
vbcc-68k-src
/
machines
/
amiga68k
/
libsrc
/
stdlib
/
strtoul.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-01-01
|
1KB
|
56 lines
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
unsigned long strtoul(const char *nptr,char **endptr,int base)
{ const char *p=nptr,*q;
char c=0;
unsigned long r=0;
if(base<0||base==1||base>36)
{ if(endptr!=NULL)
*endptr=(char *)nptr;
return 0;
}
while(isspace(*p))
p++;
if(*p=='-'||*p=='+')
c=*p++;
if(base==0)
{ if(p[0]=='0')
{ if(tolower(p[1])=='x'&&isxdigit(p[2]))
{ p+=2;
base=16; }
else
base=8;
}else
base=10;
}
q=p;
for(;;)
{ int a;
if(!isalnum(*q))
break;
a=isdigit(*q)?*q-'0':tolower(*q)-('a'-10);
if(a>base)
break;
if(r>(ULONG_MAX-a)/base||r*base>ULONG_MAX-a)
{ errno=ERANGE; /* overflow */
r=ULONG_MAX; }
else
r=r*base+a;
q++;
}
if(q==p) /* Not a single number read */
{ if(endptr!=NULL)
*endptr=(char *)nptr;
return 0;
}
if(c=='-')
r=-r;
if(endptr!=NULL)
*endptr=(char *)q;
return r;
}